/**
 * Carga los eventos del calendario
 * @returns {undefined}
 */
function loadEvents() {
    var paramsMap = {'fields': 'items(id,description,end,location,source/title,source/url,start,summary,htmlLink)'};
    // Hace la solicitud al api
    var response = calendarApiRequest('events', paramsMap);
    var googleEvents = response.jsonObject.items;
    var i = 0;
    while (googleEvents[i] !== undefined) {
        appendEventContent(googleEvents[i]);
        i++;
    }
}

/**
 * Agrega el evento al codigo html
 * @param {type} googleEvent
 * @returns {undefined}
 */
function appendEventContent(googleEvent) {
    var qLi = $('<li></li>');
    var eachEvent = $("<a href='#' class='event'></a>");

    // Título
    var qTitle = $("<h3></h3>").html(googleEvent.summary);
    eachEvent.append(qTitle);

    // Enlace
    eachEvent.attr('data-url', googleEvent.htmlLink);

    // Lugar:
    var qPlace = $('<h4 style="display:none" class="place-info"></h4>');
    qPlace.html('Lugar: ');
    eachEvent.append(qPlace);

    // Fechas
    var qStartDate;
    var dateObj = null;
    if (googleEvent.start.date !== undefined) {
        qStartDate = $("<h5>Comienza: </h5>").append(googleEvent.start.date);
        dateObj = new Date(googleEvent.start.date);
    } else if (googleEvent.start.dateTime !== undefined) {
        qStartDate = $("<h5>Comienza: </h5>").append(googleEvent.start.dateTime);
        dateObj = new Date(googleEvent.start.dateTime);
    }
    var qEndDate;
    if (googleEvent.end.date !== undefined) {
        qEndDate = $("<h5>Termina: </h5>").append(googleEvent.end.date);
    } else if (googleEvent.end.dateTime !== undefined) {
        qEndDate = $("<h5>Termina: </h5>").append(googleEvent.end.dateTime);
    }
    eachEvent.append(qStartDate);
    eachEvent.append(qEndDate);

    // Icono
    var qIcon = $('<div class="icon iconBorde"></div>');
    qIcon.append('<h4>' + getDayOfAWeek(dateObj) + '</h4>');
    qIcon.append('<h5>' + dateObj.getUTCDate() + '</h5>');
    eachEvent.prepend(qIcon);

    //Enlace a ver más
    eachEvent.click(function(event) {
        $("#evento_detalle .detalle").html("");
        $("#evento_detalle .detalle").append($(this).html());
        $("#evento_detalle .detalle").find('.event-brief-des').css('display', 'none');
        $("#evento_detalle .detalle").find('.event-full-description').css('display', 'block');
        $("#evento_detalle .detalle").find('.place-info').css('display', 'block');
        $("#evento_detalle .detalle").find('.icon').remove();

        // Crea el mapa del evento
        mapData = $(this).find('.mapa-data');
        newMap = $("<div class='mapa' style='width=100%;'></div>");
        newMap.attr('id', 'det-' + mapData.attr('id'));
        newMap.attr('lat', mapData.attr('data-lat'));
        newMap.attr('lang', mapData.attr('data-lang'));
        newMap.attr('info', mapData.attr('data-info'));
        newMap.attr('title', mapData.attr('data-title'));
        $("#evento_detalle .detalle .event-full-description").before(newMap);
        initializeGoogleMapById(newMap.attr('id'));
        setTimeout(function() {
            newMap.trigger('resize');
        }, 1000);
        $('#evento_detalle').addClass('active').siblings('.page').removeClass('active');
        // Boton volver
        $('#eventGoBack').unbind('click');
        $('#eventGoBack').click(function() {
            $('#mainMenu .noti a').trigger('click');
        });
        // Botón compartir
        $('#shareEvent').unbind('click');
        $('#shareEvent').attr('data-share-url', $(this).attr('data-url'));
        $('#shareEvent').click(function(){
            shareEvent(googleEvent.summary, $(this).attr('data-share-url'));
        });
    });

    // Descripción del evento
    var eventDes = googleEvent.description;
    if (eventDes.length > 100) {
        eventDes = eventDes.substring(0, 100) + '...';
    }
    eachEvent.append('<p class="event-brief-des">' + eventDes + '</p>');
    eachEvent.append('<p class="event-full-description" style="display:none;text-align: justify;">' + googleEvent.description + '</p>');

    // Ubicación: guarda un tag con la información para construir el mapa
    var locationInfo = googleEvent.location.split(";")[0];
    qPlace.append('<span>' + locationInfo + '</span>');
    var locationCoords = googleEvent.location.split(";")[1];
    var lat = locationCoords.split(",")[0];
    var lang = locationCoords.split(",")[1];
    var qMapData = $("<span class='mapa-data'></span>");
    qMapData.attr('id', 'map-' + googleEvent.id);
    qMapData.attr('data-lat', lat);
    qMapData.attr('data-lang', lang);
    qMapData.attr('data-info', locationInfo);
    qMapData.attr('data-title', googleEvent.summary);
    eachEvent.append(qMapData);

    // Agrega el evento al item de lista y al racimo
    qLi.append(eachEvent);
    $("#noticias ul.racimo").append(qLi);

    // Crea el mapa);
    //initializeGoogleMapById(qMap.attr('id'));
}

/**
 * Retorna el dia de la semana de una fecha
 * @param {Date} eventDate Fecha de la cual se quiere obtener el dia
 * @returns {String}
 */
function getDayOfAWeek(eventDate) {
    switch (eventDate.getUTCDay())
    {
        case 0:
            return "Domingo";
        case 1:
            return "Lunes";
        case 2:
            return "Martes";
        case 3:
            return "Miércoles";
        case 4:
            return "Jueves";
        case 5:
            return "Viernes";
        case 6:
            return "Sábado";
        default:
            return "undefined";
    }
}

/**
 * apiRequest
 * @param {String} apiCommand
 * @param {Object} paramsMap Objecto con los parámetros a enviar al api
 * @returns api command json response
 */
function calendarApiRequest(apiCommand, paramsMap) {

    var response = {'jsonObject': null, 'errorMsg': null, 'responseText': null};
    // build url api request
    var url = "https://www.googleapis.com/calendar/v3/calendars/" + calendarId + "/";
    url = url + apiCommand + '?';
    for (var name in paramsMap) {
        url = url + "&" + name + '=' + paramsMap[name];
    }
    url = url + "&key=" + googleApiKey;
    //alert(url);

    // Hace el post
    try {
        var xmlHttp = new XMLHttpRequest();
        xmlHttp.open("GET", url, false);
        xmlHttp.send(null);
    } catch (e) {
        response['errorMsg'] = 'No hay respuesta del servidor';
        return response;
    }

// Carga el código de respuesta
    try {
        var responseStr = xmlHttp.responseText;
        response['jsonObject'] = jQuery.parseJSON(responseStr);
        response['responseText'] = responseStr;
        //alert(responseStr);
    } catch (e) {
        response['jsonObject'] = null;
        response['errorMsg'] = 'Formato de respuesta inesperado';
        return response;
    }

// Retorna la respuesta
    return response;
}